﻿using System;
using System.Collections.Generic;
using Neturion.Dados;
using Neturion.IRepositorios;
using Neturion.Repositorios;
using Neturion.Utils;

namespace Neturion.Negocios
{
    /// <summary>
    /// 
    /// </summary>
    public class NegocioProtocolo
    {
        private IRepositorioProtocolo _repositorioProtocolo;

        /// <summary>
        /// 
        /// </summary>
        public NegocioProtocolo()
        {
            _repositorioProtocolo = new RepositorioProtocolo();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="protocolo"></param>
        /// <returns></returns>
        public Protocolo Inserir(Protocolo protocolo)
        {
            protocolo.DataCadastro = DateTime.Now;
            //protocolo.Codigo = GeradorCodigo.GerarCodigo(1);
            //protocolo.Codigo += (_repositorioProtocolo.ObterUltimoIdCodigoInteiro() + 1).ToString();
            //protocolo.Codigo += GeradorCodigo.GerarCodigo(1, protocolo.Codigo);
            return _repositorioProtocolo.Inserir(protocolo);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="protocolo"></param>
        /// <returns></returns>
        public Protocolo Atualizar(Protocolo protocolo)
        {
            return _repositorioProtocolo.Atualizar(protocolo);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="protocolo"></param>
        public void Excluir(Protocolo protocolo)
        {
            Protocolo protocoloTmp = ObterPorId(protocolo.ProtocoloId);
            _repositorioProtocolo.Excluir(protocoloTmp);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IList<Protocolo> ObterTodos()
        {
            return _repositorioProtocolo.ObterTodos();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Protocolo ObterPorId(int id)
        {
            return _repositorioProtocolo.ObterPorId(id);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="motivoProtocolo"></param>
        /// <returns></returns>
        public string ObterNumeroProtocolo(MotivoProtocolo motivoProtocolo)
        {
            int anoNumeroProtocolo = Convert.ToInt32(DateTime.Now.ToString("yyyy"));
            int mesNumeroProtocolo = Convert.ToInt32(DateTime.Now.ToString("MM"));
            int retorno = 0;
            string numeroProtocolo = string.Empty;

            Protocolo protocolo = _repositorioProtocolo.ObterUltimoPorMotivoProtocolo(motivoProtocolo);
            if (protocolo != null && !string.IsNullOrEmpty(protocolo.Codigo))
            {
                //2012 01 SOL 000001
                int.TryParse(protocolo.Codigo.Substring(0, 4), out anoNumeroProtocolo);

                int.TryParse(protocolo.Codigo.Substring(4, 2), out mesNumeroProtocolo);
                
                int.TryParse(protocolo.Codigo.Substring(protocolo.Codigo.Length - 6), out retorno);

                if (DateTime.Now.ToString("yyyy").Equals(anoNumeroProtocolo.ToString()) && DateTime.Now.ToString("MM").Equals(mesNumeroProtocolo.ToString().PadLeft(2, '0')))
                {
                    retorno++;
                }
                else
                {
                    anoNumeroProtocolo = Convert.ToInt32(DateTime.Now.ToString("yyyy"));
                    mesNumeroProtocolo = Convert.ToInt32(DateTime.Now.ToString("MM"));
                    retorno = 0;
                }
            }

            numeroProtocolo = anoNumeroProtocolo.ToString() + mesNumeroProtocolo.ToString().PadLeft(2, '0') + motivoProtocolo.TipoMotivo.Codigo + retorno.ToString().PadLeft(6, '0');

            return numeroProtocolo;
        }

        public Protocolo ObterPorCodigo(string codigo, Usuario usuarioPermissao)
        {
            return _repositorioProtocolo.ObterPorCodigo(codigo);
        }
    }
}